#ifndef __MY_UART_H__
#define __MY_UART_H__

#define UART_PRINT_EN     1
#define _USART1_COM_
// #define _USART2_COM_
#include "n32l40x.h"
#include <stdio.h>

typedef enum
{
    FAILED = 0,
    PASSED = !FAILED
} TestStatus;


#define USARTz_MAX_BUFF_SIZE        (2048)

#ifdef _USART1_COM_

// #define USARTx            USART1
// #define USARTx_GPIO       GPIOA
// #define USARTx_CLK        RCC_APB2_PERIPH_USART1
// #define USARTx_GPIO_CLK   RCC_APB2_PERIPH_GPIOA
// #define USARTx_RxPin      GPIO_PIN_10
// #define USARTx_TxPin      GPIO_PIN_9
// #define USARTx_Rx_GPIO_AF GPIO_AF4_USART1
// #define USARTx_Tx_GPIO_AF GPIO_AF4_USART1

// #define GPIO_APBxClkCmd   RCC_EnableAPB2PeriphClk
// #define USART_APBxClkCmd  RCC_EnableAPB2PeriphClk


// #define USARTy            USART1
// #define USARTy_GPIO       GPIOA
// #define USARTy_CLK        RCC_APB2_PERIPH_USART1
// #define USARTy_GPIO_CLK   RCC_APB2_PERIPH_GPIOA
// #define USARTy_RxPin      GPIO_PIN_10
// #define USARTy_TxPin      GPIO_PIN_9
// #define USARTy_Rx_GPIO_AF GPIO_AF4_USART1
// #define USARTy_Tx_GPIO_AF GPIO_AF4_USART1
// #define USARTy_APBxClkCmd RCC_EnableAPB2PeriphClk
// #define USARTy_IRQn       USART1_IRQn
// #define USARTy_IRQHandler USART1_IRQHandler


#define USARTz                  USART2
#define USARTz_GPIO             GPIOB
#define USARTz_CLK              RCC_APB1_PERIPH_USART2
#define USARTz_GPIO_CLK         RCC_APB2_PERIPH_GPIOB
#define USARTz_RxPin            GPIO_PIN_5
#define USARTz_TxPin            GPIO_PIN_4
#define USARTz_Rx_GPIO_AF       GPIO_AF6_USART2
#define USARTz_Tx_GPIO_AF       GPIO_AF4_USART2
#define USARTz_APBxClkCmd       RCC_EnableAPB1PeriphClk
#define USARTz_IRQn             USART2_IRQn
#define USARTz_IRQHandler       USART2_IRQHandler

#define USARTz_DAT_Base             (USART2_BASE + 0x04)
#define USARTz_Tx_DMA_Channel       DMA_CH3
#define USARTz_Tx_DMA_FLAG          DMA_FLAG_TC3
#define USARTz_Tx_DMA_INT           DMA_INT_TXC3
#define USARTz_Tx_DMA_IRQn          DMA_Channel3_IRQn
#define USARTz_Tx_DMA_IRQHandler    DMA_Channel3_IRQHandler



#define USARTz_Rx_DMA_Channel       DMA_CH4
#define USARTz_Rx_DMA_FLAG          DMA_FLAG_TC4
#define USARTz_Rx_DMA_INT           DMA_INT_TXC4
#define USARTz_Rx_DMA_IRQn          DMA_Channel2_IRQn
#define USARTz_Rx_DMA_IRQHandler    DMA_Channel2_IRQHandler

#define USARTz_Tx_DMA_REMAP         DMA_REMAP_USART2_TX
#define USARTz_Rx_DMA_REMAP         DMA_REMAP_USART2_RX




#endif

#ifdef _USART2_COM_
#define USARTx            USART2
#define USARTx_GPIO       GPIOA
#define USARTx_CLK        RCC_APB1_PERIPH_USART2
#define USARTx_GPIO_CLK   RCC_APB2_PERIPH_GPIOA
#define USARTx_RxPin      GPIO_PIN_3
#define USARTx_TxPin      GPIO_PIN_2
#define USARTx_Rx_GPIO_AF GPIO_AF4_USART2
#define USARTx_Tx_GPIO_AF GPIO_AF4_USART2

#define GPIO_APBxClkCmd   RCC_EnableAPB2PeriphClk
#define USART_APBxClkCmd  RCC_EnableAPB1PeriphClk

#endif

extern uint8_t uartz_recv_flag;

TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);

void uart_send(uint8_t *p_data, uint8_t len);
void uartx_send_data(uint8_t *p_buff, uint16_t len);

int fputc(int ch, FILE* f);
void my_uart_init(void);

#endif
